<?php

function bd_get_error() {
    return conf::$lastError;
}

/**
 * Transforma um Array em insert
 * @param Array $dados
 * @param String $tabela
 * @param Array $campos
 * @return String
 */
function arrayToSQL($dados, $tabela, $campos) {
    $sqls;
    for ($i = 0; $i < count($dados); $i++) {
        $sql = "insert into $tabela (";
        for ($j = 0; $j < count($campos); $j++) {
            if ($j == (count($campos) - 1)) {
                $sql .= $campos[$j] . ") ";
            } else {
                $sql .= $campos[$j] . ",";
            }
        }
        $sql .= "values(";
        for ($j = 0; $j < count($campos); $j++) {
            if ($j == (count($campos) - 1)) {
                $sql .= "'" . $dados[$i][$j] . "') ";
            } else {
                $sql .= "'" . $dados[$i][$j] . "',";
            }
        }
        $sqls[$i] = $sql;
    }
    return $sqls;
}

/**
 * Gera uma tabela capaz de fazer operações basicas com o banco dados na tabela selecionada
 * @param type $resultado Resultado em forma de Array
 * @param type $paginaRemover pagina em php para remover
 * @param type $paginaAtualizar pagina em php para remover
 * @param string $scriptTerminado Script para quando terminar
 */
function createCRUD($resultado, $paginaRemover, $paginaAtualizar, $scriptTerminado = "location.reload()") {
    if (count($resultado) <= 0) {
        echo "<div class='col_12' style='text-align:center' >Nada encontrado</div>";
        return false;
    }
    echo "<table style='width:100%'>";
    $campos = array_keys($resultado[0]);
    echo "<thead>\n<tr>\n";
    foreach ($campos as $value) {
        echo "<td>" . $value . "</td>";
    }
    echo "</tr>\n</thead>\n";
    echo "<tbody>\n";
    foreach ($resultado as $linha) {
        echo "<tr>\n";
        $contador = 0;
        foreach ($linha as $coluna) {
            if ($campos[$contador] == "id") {
                echo "<td> " . $coluna . "</td>\n";
            } else {
                echo "<td><input type='text' id='table" . $campos[$contador] . $linha['id'] . "'  style='width:100%' value='" . $coluna . "' /></td>\n";
            }

            $contador++;
        }
        echo "
   <td style='width:100px;'>
   <input type='button' value='Remover' style='width:100%' onclick=\"$.get('$paginaRemover',{'id':'" . $linha['id'] . "'},function(dados){ $scriptTerminado })\" /> 
   </td>";

        echo "
   <td style='width:100px;'>
   <input type='button' value='Atualizar' style='width:100%' onclick=\"$.get('$paginaAtualizar',{";
        $contador = 0;
        foreach ($campos as $value) {
            if ($value != "id") {//proibe id
                if ($contador == (count($campos) - 1)) {
                    echo "'$value':$('#table" . $value . $linha['id'] . "').val()";
                } else {
                    echo "'$value':$('#table" . $value . $linha['id'] . "').val(),";
                }
            }//proibe id
            $contador++;
        }
        echo ",'id':'" . $linha['id'] . "'},function(dados){ $scriptTerminado })\" /> 
   </td>";
        echo "</tr>\n";
    }
    echo "</tbody>";
    echo "</table>";
}

/**
 * Gera uma visualização da tabela selecionada
 * @param type $resultado Resultado em forma de Array 
 */
function createTable($resultado) {
    if (count($resultado) <= 0) {
        echo "<div class='col_12' style='text-align:center' >Nada encontrado</div>";
        return false;
    }
    echo "<table style='width:100%'>";
    $campos = array_keys($resultado[0]);
    echo "<thead>\n<tr>\n";
    foreach ($campos as $value) {
        echo "<td>" . $value . "</td>";
    }
    echo "</tr>\n</thead>\n";
    echo "<tbody>\n";
    foreach ($resultado as $linha) {
        echo "<tr>\n";
        foreach ($linha as $coluna) {
            echo "<td>" . $coluna . "</td>\n";
        }
        echo "</tr>\n";
    }
    echo "</tbody>";
    echo "</table>";
}

function one($query) {
    if (count($query) < 1) {
        return "";
    } else {
        return $query[0];
    }
}

function col($query, $column) {

    $retorno = array();
    if (count($query) < 1) {
        return $retorno;
    }
    if (is_object($query[0])) {
        foreach ($query as $sis) {
            $retorno[] = $sis->{$column};
        }
    } else {
        foreach ($query as $sis) {
            $retorno[] = $sis[$column];
        }
    }
    return $retorno;
}

/**
 * Retorna o comando SQL em forma de Objeto 
 * @param type $comando
 * @param type $atributos
 * @param boolean $oo
 */
function query($comando, $atributos = null, $oo = true) {
    return execute($comando, $atributos, $oo);
}

function syncDBs() {
    $contador = 0;
    conf::getServidores();
    foreach (conf::$servidores as $s) {
        foreach (conf::getEspera($contador) as $e) {
            $comando = ($e);
            conf::conectar($contador);
            if (strlen(conf::$odbcDriver) > 0) {
                $query = odbc_exec(conf::$pkj_bd_sis_conexao[$contador], $comando);
            } else {
                switch ($s["servidor"]) {
                    case "mysql":
                        $query = @mysql_query($comando, conf::$pkj_bd_sis_conexao[$contador]);
                        break;
                    case "postgree":
                        $query = @pg_query(conf::$pkj_bd_sis_conexao[$contador], $comando);
                        break;
                    case "mssql":
                        $query = @mssql_query($comando, conf::$pkj_bd_sis_conexao[$contador]);
                        break;
                    case "sqlite":
                        if ($select[0] == "select") {
                            $query = conf::$pkj_bd_sis_conexao[$contador]->query($comando);
                        } else {
                            $query = conf::$pkj_bd_sis_conexao[$contador]->exec($comando);
                        }
                        break;
                }
            }
        }
        conf::clearEspera($contador);
        $contador++;
    }
}

/**
 * Retorna o comando SQL em forma de Array
 * @param type $comando
 * @param type $atributos
 * @param boolean $oo
 */
function execute($comando, $atributos = null, $oo = false, $_vezes = 0) {
    $comando = trim($comando);
    $comando = str_replace(PHP_EOL, '', $comando);
    $qtd = count($atributos);
    if ($qtd > 0) {
        $contador = 0;
        foreach ($atributos as $value) {
            $atributos[$contador] = $value;
            $contador++;
        }
        //error_reporting(0);
        $precompilado = "";
        $arr = explode("?", $comando);
        $indice = 0;
        error_reporting(0);
        for ($index = 0; $index < (count($arr) - 1 ); $index++) {
            $precompilado .= $arr[$index] . "'" . addslashes($atributos[$index]) . "'";
            $indice = $index;
        }
        $comando = $precompilado . $arr[$indice + 1];
    }
    $query = null;
    $contador = 0;
    $select = explode(" ", $comando);
    $isSelect = (strtolower($select[0]) == "select") ? true : false;
    conf::getServidores();
    foreach (conf::$servidores as $servidor) {
        if ($isSelect && $contador != conf::$ativo) {
            continue;
        }
        conf::conectar($contador);
        if (strlen(conf::$odbcDriver) > 0) {
            $query = odbc_exec(conf::$pkj_bd_sis_conexao[$contador], $comando);
            conf::$lastError = odbc_errormsg(conf::$pkj_bd_sis_conexao[$contador]);
        } else {
            switch ($servidor["servidor"]) {
                case "mysql":
                    $query = @mysql_query($comando, conf::$pkj_bd_sis_conexao[$contador]);
                    conf::$lastError = mysqli_error(conf::$pkj_bd_sis_conexao[$contador]);
                    break;
                case "postgree":
                    $query = @pg_query(conf::$pkj_bd_sis_conexao[$contador], $comando);
                    conf::$lastError = pg_last_error(conf::$pkj_bd_sis_conexao[$contador]);
                    break;
                case "mssql":
                    $query = @mssql_query($comando, conf::$pkj_bd_sis_conexao[$contador]);
                    conf::$lastError = mssql_get_last_message();
                    break;
                case "sqlite":
                    if (strtoupper($select[0]) == "SELECT") {
                        $query = @conf::$pkj_bd_sis_conexao[$contador]->query($comando);
                    } else {
                        $query = @conf::$pkj_bd_sis_conexao[$contador]->exec($comando);
                    }
                    conf::$lastError = conf::$pkj_bd_sis_conexao[$contador]->lastErrorMsg();
                    break;
            }
            if (!$query || is_null($query)) {
                conf::addEspera($contador, $comando);
            }
            $contador ++;
        }
    }
    $retorno = array();
    conf::conectar(conf::$ativo);
    if ($isSelect) {
        if (strlen(conf::$odbcDriver) > 0) {
            if (!$query) {
                return false;
            }
            while ($row = ($oo) ? @odbc_fetch_object($query) : @odbc_fetch_assoc($query)) {
                $retorno[] = $row;
            }
        } else {
            switch (conf::$servidor) {
                case "mysql":
                    if (!$query) {
                        return false;
                    }
                    while ($row = ($oo) ? @mysql_fetch_object($query) : @mysql_fetch_assoc($query)) {
                        $retorno[] = $row;
                    }
                    break;
                case "postgree":
                    if (!$query) {
                        return false;
                    }
                    while ($row = ($oo) ? @pg_fetch_object($query) : @pg_fetch_assoc($query)) {
                        $retorno[] = $row;
                    }
                    break;
                case "mssql":
                    if (!$query) {
                        return false;
                    }
                    while ($row = ($oo) ? @mssql_fetch_object($query) : @mssql_fetch_array($query)) {
                        $retorno[] = $row;
                    }
                    break;
                case "sqlite":
                    if (!$query) {
                        return false;
                    }
                    if ($oo) {
                        while ($row = $query->fetchArray()) {
                            $obj = new stdClass();
                            foreach ($row as $key => $value) {
                                if (!is_numeric($key)) {
                                    $obj->$key = $value;
                                }
                            }
                            $retorno[] = $obj;
                        }
                    } else {
                        while ($row = $query->fetchArray()) {
                            $retorno[] = $row;
                        }
                    }
                    break;
            }
        }
        return ($retorno);
    } else {
        return $query;
    }
}

function SQLinsert($tabela, $array) {
    $sql = 'insert into ' . $tabela;
    $tabela = null;
    $chaves = array();
    $valores = array();
    foreach ($array as $chave => $valor) {
        $chaves[] = $chave;
        $valores[] = $valor;
    }
    $CountChaves = count($chaves);
    $CountValores = count($valores);
    $sql .= ' ( ';
    for ($i = 0; $i < $CountChaves; $i++) {
        if ($i == $CountChaves - 1) {
            $sql.=$chaves[$i];
        } else {
            $sql.=$chaves[$i] . ',';
        }
    }
    $sql .= ' ) values( ';
    $CountChaves = null;
    $chaves = null;
    for ($i = 0; $i < $CountValores; $i++) {
        if ($i == $CountValores - 1) {
            $sql.= '\'' . replace($valores[$i], '\'', '') . '\'';
        } else {
            $sql.= '\'' . replace($valores[$i], '\'', '') . '\',';
        }
    }
    $sql .= ' )';
    $CountValores = null;
    $valores = null;
    return $sql;
}

function SQLreplace($tabela, $array, $where) {
    $sql = '';
    if (count(query(SQLselect($tabela, array($array[0]), $where))) < 1) {
        $sql = SQLinsert($tabela, $array);
    } else {
        $sql = SQLupdate($tabela, $array, $where);
    }
    return $sql;
}

function SQLinsertorupdate($tabela, $array, $where) {
    return SQLreplace($tabela, $array, $where);
}

function SQLupdate($tabela, $array, $where) {
    $sql = 'update ' . $tabela . ' set ';
    $tabela = null;
    $chaves = array();
    $valores = array();
    foreach ($array as $chave => $valor) {
        $chaves[] = $chave;
        $valores[] = $valor;
    }
    $CountChaves = count($chaves);
    $CountValores = count($valores);
    for ($i = 0; $i < $CountChaves; $i++) {
        if ($i == $CountChaves - 1) {
            $sql.=$chaves[$i] . '=\'' . replace($valores[$i], '\'', '') . '\'';
        } else {
            $sql.=$chaves[$i] . '=\'' . replace($valores[$i], '\'', '') . '\',';
        }
    }
    $sql .= ' where ' . $where;
    $CountChaves = null;
    $CountValores = null;
    $chaves = null;
    $valores = null;
    return $sql;
}

function SQLdelete($tabela, $where) {
    return 'delete from ' . $tabela . ' where ' . $where;
}

function SQLselect($tabela, $campos, $where) {
    $sql = 'select ';
    $CountCampos = count($campos);
    for ($i = 0; $i < $CountCampos; $i++) {
        if ($i == $CountCampos - 1) {
            $sql.=$campos[$i];
        } else {
            $sql.=$campos[$i] . ',';
        }
    }
    $CountCampos = null;
    $campos = null;
    $sql.=' from ' . $tabela . ' where ' . $where;
    return $sql;
}

?>
